package com.liuqing.www.加密算法;

import java.util.UUID;

import sun.misc.BASE64Decoder;
/**
 * <p>Title:Base64Utils</p>
 * <p>Description:以Base64格式的编码解码 </p>
 * @author kevin
 * @Date 2009-3-20
 * @version 1.0
 */

public class Base64加密 {
  public Base64加密() {
  }
  public static String getBASE64NoAddSign(String str){
	  String retstr="";
	  if(str!=null){
	      retstr=getBASE64(str).replace("+","%2B");
	  }
	  return retstr;
  }
  //进行编码
  public static String getBASE64(String s){
    if (s == null) return null;
    return (new sun.misc.BASE64Encoder()).encode( s.getBytes() );
  }
  //进行解码
  public static String getFromBASE64(String s) {
	  if (s == null) return null;
	  BASE64Decoder decoder = new BASE64Decoder();
	  try {
	    byte[] b = decoder.decodeBuffer(s.replace("%2B","+"));
	    return new String(b);
	  } catch (Exception e) {
	    return null;
	  }
  }
  public static void main(String[] args) {
	  /**http://www.ruanyifeng.com/blog/2008/06/base64.html
	   * 第一步，将每三个字节作为一组，一共是24个二进制位。

第二步，将这24个二进制位分为四组，每个组有6个二进制位。

第三步，在每组前面加两个00，扩展成32个二进制位，即四个字节。

第四步，根据下表，得到扩展后的每个字节的对应符号，这就是Base64的编码值。
a）二个字节的情况：将这二个字节的一共16个二进制位，按照上面的规则，转成三组，最后一组除了前面加两个0以外，后面也要加两个0。这样得到一个三位的Base64编码，再在末尾补上一个“=”号。

一个字节的情况：将这一个字节的8个二进制位，按照上面的规则转成二组，最后一组除了前面加二个0以外，后面再加4个0。这样得到一个二位的Base64编码，再在末尾补上两个“=”号。


	   * url传入特殊字符时以及不可解释性3 4
	   * "AAA"=65==010000 010100 000101 000001==16,20,5,1= Q U F B
	   * "AA"=65==00010000 00010100 00000100==16,20,4= Q U E=
	   * A=65=010000 01==00010000 00010000=16,16= qq==
	   */
	  byte[] b="AAA".getBytes();
	  for(byte bb:b){
		  System.out.println( bb);
	  }
	  System.out.println(UUID.randomUUID());//通过时间钟得到惟一区别的字符串，常用于区别文件以及用户session
	 System.out.println(Base64加密.getBASE64("A++")); 
	 System.out.println(Base64加密.getFromBASE64(Base64加密.getBASE64("AAA"))); 
	  
  }
}
